package com.ruicheng.iam.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;

/**
 * swagger 配置
 *
 * @author huang guang yue
 * @version v1.0.0
 * @date 2020 2020/10/29 9:47
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    // 允许匿名访问
    // /swagger**/**
    // /webjars/**
    // /v3/**
    // /doc.html

    /**
     * IAM 服务 API
     */
    @Bean("iamServiceApi")
    public Docket disassembleFlowDocketV1() {
        return create("iamServiceApi", "com.ruicheng.iam.controller");
    }

    /**
     * 生成接口信息，包括标题、联系人等
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("西南项目API接口，测试环境")
                .description("如有疑问请自行解决，因为我的代码没有 bug！！！！")
                .contact(new Contact("黄光跃", "https://gitee.com/huanggyaaa", "huanggyaaa@gmail.com"))
                .version("1.0")
                .build();
    }

    /**
     * 通用参数
     */
    private List<Parameter> getGlobalRequestParameters() {
        List<Parameter> parameters = new ArrayList<>();

        // 请求头 token 参数
        Parameter tokenParam = new ParameterBuilder()
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .name("token")
                .description("token")
                .required(false)
                .build();

        // 添加 token
        parameters.add(tokenParam);
        return parameters;
    }

    /**
     * PathSelectors.regex("/api.*")过滤规则表达式
     *
     * @param groupName   组名
     * @param basePackage 包路径
     * @return Docket
     */
    private Docket create(String groupName, String basePackage) {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName(groupName)
                .apiInfo(apiInfo())
                // 定义是否开启 swagger
                .enable(true)
                .select()
                // 生成文档的基础 package
                .apis(RequestHandlerSelectors.basePackage(basePackage))
                .paths(PathSelectors.any())
                .build()
                // 不使用默认的响应码
                .useDefaultResponseMessages(false)
                // 协议
                .protocols(new LinkedHashSet<>(Arrays.asList("http", "https")));
    }

}
